package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.util.TimeUtil;
import com.fdb.efp.nls.common.ConsoleConstant;
import com.fdb.efp.flow.common.vo.PageApproveVO;
import com.fdb.efp.nls.common.RiskColltConstant;
import com.fdb.efp.nls.service.facade.ColltDelayAppApprService;
import com.fdb.efp.nls.service.facade.ColltDelayCaseAppService;
import com.fdb.efp.nls.service.facade.ColltDelayCaseRecordService;
import com.fdb.efp.nls.service.facade.ColltTaskInfoService;
import com.fdb.efp.nls.service.vo.ColltDelayCaseAppVO;
import com.fdb.efp.nls.service.vo.ColltDelayCaseRecordVO;
import com.fdb.efp.nls.service.vo.ColltTaskInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 需求编号【2019D0509】
 *
 * @author qiuyf
 * @version 0.1 初始为0.1,后续变更则修改
 * @since 2019/9/20 19:26
 */
@Service("flowColltDelayAppApprService")
public class ColltDelayAppApprServiceImpl implements ColltDelayAppApprService {

    private static Logger logger = LoggerFactory.getLogger(ColltDelayAppApprServiceImpl.class);

    @Autowired
    @Qualifier("colltDelayCaseAppService")
    private ColltDelayCaseAppService colltDelayCaseAppService;

    @Autowired
    @Qualifier("colltDelayCaseRecordService")
    private ColltDelayCaseRecordService colltDelayCaseRecordService;

    @Autowired
    @Qualifier("colltTaskInfoService")
    private ColltTaskInfoService colltTaskInfoService;


    @Override
    public void pass(String bizSerno, PageApproveVO pageApproveVo) {
        logger.debug("======>委外催收延案申请审批通过后处理开始，流水号<======" +bizSerno);
        int num = updColltDelayCase(bizSerno, pageApproveVo, ConsoleConstant.APRV_STATUS_03);
        if(num != 1){
            logger.error("======>委外催收延案申请审批拒绝后处理，更新信息失败！流水号<======" +bizSerno);
        }
        logger.debug("======>委外催收延案申请审批通过后处理结束，流水号<======" +bizSerno);
        logger.debug("======>更新催收任务信息开始，延案申请流水号<======" +bizSerno);

        updColltTaskStsByPk(getColltTaskNosByPk(bizSerno), RiskColltConstant.COLLT_OUTS_TASK_STS_02);
    }

    @Override
    public void refuse(String bizSerno, PageApproveVO pageApproveVo) {
        logger.debug("======>委外催收延案申请审批拒绝后处理开始，流水号<======" +bizSerno);
        int num = updColltDelayCase(bizSerno, pageApproveVo, ConsoleConstant.APRV_STATUS_04);
        if(num != 1){
            logger.error("======>委外催收延案申请审批拒绝后处理，更新信息失败！流水号<======" +bizSerno);
        }
        //更新催收任务状态为原催收任务状态
        colltTaskInfoService.batchUpdateVO(getColltTaskInfos(bizSerno));
        logger.debug("======>委外催收延案申请审批拒绝后处理结束，流水号<======" +bizSerno);
    }

    @Override
    public void repulse(String bizSerno, PageApproveVO pageApproveVo) {
    }

    /**
     * 更新审批信息
     * @param bizSerno
     * @param pageApproveVo
     * @param apprSts
     * @return
     */
    private int updColltDelayCase(String bizSerno, PageApproveVO pageApproveVo, String apprSts){
        ColltDelayCaseAppVO colltDelayCaseAppVO = new ColltDelayCaseAppVO();
        colltDelayCaseAppVO.setDelayCaseAppSerno(bizSerno);
        colltDelayCaseAppVO.setApproveStatus(apprSts);
        colltDelayCaseAppVO.setAprvUserCode(pageApproveVo.getAprvUserId());
        colltDelayCaseAppVO.setAprvUserName(pageApproveVo.getAprvUserName());
        colltDelayCaseAppVO.setAprvComment(pageApproveVo.getAprvComment());
        colltDelayCaseAppVO.setAprvDate(TimeUtil.getCurrentDate());
        colltDelayCaseAppVO.setLastChgUsr(pageApproveVo.getAprvUserId());
        return colltDelayCaseAppService.updateByPk(colltDelayCaseAppVO);
    }

    /**
     * 更新催收任务信息表中的任状态
     * @param colltTaskNoList
     */
    private void updColltTaskStsByPk(List<String> colltTaskNoList, String taskStatus){
        List<ColltTaskInfoVO> updColltTaskList = new ArrayList<>();
        colltTaskNoList.forEach(colltTaskNo -> {
            ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
            colltTaskInfoVO.setColltTaskNo(colltTaskNo);
            colltTaskInfoVO.setTaskSts(taskStatus);
            updColltTaskList.add(colltTaskInfoVO);
        });
        colltTaskInfoService.batchUpdateVO(updColltTaskList);
    }

    private List<String> getColltTaskNosByPk(String bizSerno){
        logger.info("======>通过业务流水号获取催收任务编号集开始，流水号<======" +bizSerno);
        List<ColltDelayCaseRecordVO> cdcrVOList = getColltDelayCaseRecordByPk(bizSerno);
        List<String> colltTaskNos = cdcrVOList.stream().map(ColltDelayCaseRecordVO::getColltTaskNo).collect(Collectors.toList());

        logger.info("======>通过业务流水号获取催收任务编号集结束，结束数量为:<======" +colltTaskNos.size());
        return colltTaskNos;
    }


    private List<ColltTaskInfoVO> getColltTaskInfos(String bizSerno){
        List<ColltTaskInfoVO> result = new ArrayList<>();
        logger.info("======>通过业务流水号获取催收任务编号、催收任务状态开始，流水号<======" +bizSerno);

        List<ColltDelayCaseRecordVO> cdcrVOList = getColltDelayCaseRecordByPk(bizSerno);
        cdcrVOList.forEach(vo ->{
            ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
            colltTaskInfoVO.setColltTaskNo(vo.getColltTaskNo());
            colltTaskInfoVO.setTaskSts(vo.getTaskSts());
            result.add(colltTaskInfoVO);
        });
        logger.info("======>通过业务流水号获取催收任务编号、催收任务状态结束，结束数量为:<======" +cdcrVOList.size());
        return result;
    }

    private List<ColltDelayCaseRecordVO> getColltDelayCaseRecordByPk(String bizSerno){
        logger.info("======>通过业务流水号获取延案申请记录信息开始，流水号<======" +bizSerno);
        ColltDelayCaseRecordVO colltDelayCaseRecordVO = new ColltDelayCaseRecordVO();
        colltDelayCaseRecordVO.setDelayCaseAppSerno(bizSerno);
        List<ColltDelayCaseRecordVO> cdcrVOList = Optional.ofNullable(colltDelayCaseRecordService.queryByDelayCaseRecords(colltDelayCaseRecordVO))
                .orElse(new ArrayList<>());
        logger.info("======>通过业务流水号获取催收任务编号集结束，结束数量为:<======" +cdcrVOList.size());
        return cdcrVOList;
    }

}
